/**
 * date：2010-11-11
 * author：eason
 * description：基本动作类。
 * 该类为动作增加了超时退出功能。如果在构造函数中传入的timeOut变量不为0，则会启动计时器。
 * 一旦启动了计时器，该动作在没有限定时间内没有执行完成时，也会被强制中止。
 * 该类增加了execComplete()方法，该方法会调用通过setCompleteFun(fun:Function)设置的方法，以通知外部该动作已经执行完毕。
 * 子类可通过调用execComplete()来通知外部该动作已经执行完毕。
 */
package com.pickgliss.action
{
	
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	
	public class BaseAction implements IAction
	{
		protected var _completeFun : Function;
		protected var _acting : Boolean;
		
		private var _limitTimer : Timer;
		private var _timeOut : uint;
		
		/**
		 * 构造函数. 
		 * @param timeOut 超时时间.为0时表示不限时.
		 * 
		 */	
		public function BaseAction(timeOut : uint = 0)
		{
		}
		/**
		 * 执行该动作。 
		 * 
		 */		
		public function act():void
		{
			if(_timeOut>0){
				startLimitTimer();
			}
		}
		
		public function setCompleteFun(fun:Function):void
		{
			_completeFun = fun;
		}
		/**
		 * 开始限时器计时。
		 * 如果超出限定的时间没有检测完成，将停止正在进行的检测，并发送完成事件。
		 */		
		private function startLimitTimer():void
		{
			removeLimitTimer()
			_limitTimer = new Timer(_timeOut, 1);
			_limitTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onLimitTimerComplete);
			_limitTimer.start();
		}
		
		protected function onLimitTimerComplete(event:TimerEvent):void
		{
			removeLimitTimer();
			if(_acting){
				cancel();
				execComplete();
			}
		}
		private function removeLimitTimer():void
		{
			if(_limitTimer){				
				_limitTimer.stop();
				_limitTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, onLimitTimerComplete);
				_limitTimer = null;
			}
		}
		
		/**
		 * 是否正在执行。 
		 * @return 
		 * 
		 */		
		public function get acting():Boolean
		{
			return _acting;
		}
		
		public function cancel():void
		{
			removeLimitTimer();
			_acting = false;
		}
		
		/**
		 * 执行完成方法。 
		 * 该方法会调用通过setCompleteFun(fun:Function)设置的方法，以通知外部该动作已经执行完毕。
		 */		
		protected function execComplete():void
		{
			removeLimitTimer();
			if(_completeFun is Function){
				_completeFun(this);
			}
		}
	}
}